#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
PowerShell 提示符一键安装脚本
自动将 prompt.ps1 安装到 PowerShell Scripts 目录
"""

import os
import shutil
import sys
from pathlib import Path

# 配置信息
SCRIPT_NAME = "prompt.ps1"
# 动态获取用户目录和PowerShell路径
USER_HOME = Path.home()
POWERSHELL_DIR = USER_HOME.joinpath("Documents", "PowerShell")
TARGET_DIR = POWERSHELL_DIR / "Scripts" # 脚本目标目录
PROFILE_PATH = POWERSHELL_DIR / "Microsoft.PowerShell_profile.ps1" # PowerShell配置文件路径

CURRENT_DIR = Path(__file__).parent.absolute()
SOURCE_FILE = CURRENT_DIR / SCRIPT_NAME

def print_banner():
    """打印安装横幅"""
    print("=" * 60)
    print("🎨 PowerShell 智能提示符 - 一键安装脚本")
    print("=" * 60)
    print()

def check_source_file():
    """检查源文件是否存在"""
    print(f"📁 检查源文件: {SOURCE_FILE}")
    if not SOURCE_FILE.exists():
        print(f"❌ 错误: 找不到源文件 '{SCRIPT_NAME}'")
        print(f"   请确保 {SCRIPT_NAME} 文件在当前目录中")
        return False
    
    print(f"✅ 源文件存在: {SOURCE_FILE}")
    return True

def create_target_directory():
    """创建目标目录（如果不存在）"""
    print(f"📂 检查目标目录: {TARGET_DIR}")
    
    target_path = Path(TARGET_DIR)
    
    if target_path.exists():
        print(f"✅ 目标目录已存在: {TARGET_DIR}")
        return True
    
    try:
        print(f"📁 创建目录: {TARGET_DIR}")
        target_path.mkdir(parents=True, exist_ok=True)
        print(f"✅ 目录创建成功: {TARGET_DIR}")
        return True
    except Exception as e:
        print(f"❌ 创建目录失败: {e}")
        return False

def copy_script():
    """复制脚本文件"""
    target_file = Path(TARGET_DIR) / SCRIPT_NAME
    
    print(f"📋 复制文件:")
    print(f"   源文件: {SOURCE_FILE}")
    print(f"   目标文件: {target_file}")
    
    try:
        # 如果目标文件已存在，先备份
        if target_file.exists():
            backup_file = target_file.with_suffix(target_file.suffix + ".backup")
            print(f"⚠️  目标文件已存在，创建备份: {backup_file}")
            shutil.copy2(target_file, backup_file)
        
        # 复制文件
        shutil.copy2(SOURCE_FILE, target_file)
        print(f"✅ 文件复制成功!")
        
        # 验证复制结果
        if target_file.exists():
            file_size = target_file.stat().st_size
            print(f"📊 文件大小: {file_size:,} 字节")
            return True
        else:
            print(f"❌ 复制验证失败: 目标文件不存在")
            return False
            
    except Exception as e:
        print(f"❌ 复制文件失败: {e}")
        return False

def update_powershell_profile():
    """更新PowerShell配置文件，添加自动加载命令"""
    profile_path = Path(PROFILE_PATH)
    load_command = f'. "{TARGET_DIR}\\{SCRIPT_NAME}"'
    
    print(f"📝 更新PowerShell配置文件: {profile_path}")
    
    try:
        # 确保配置文件目录存在
        profile_path.parent.mkdir(parents=True, exist_ok=True)
        
        # 检查配置文件是否存在，不存在则创建
        if not profile_path.exists():
            print(f"📄 配置文件不存在，创建新文件: {profile_path}")
            profile_path.touch()
        
        # 读取现有内容，检查是否已经包含加载命令
        existing_content = ""
        if profile_path.stat().st_size > 0:
            with open(profile_path, 'r', encoding='utf-8') as f:
                existing_content = f.read()
        
        # 检查是否已经包含加载命令
        if load_command in existing_content:
            print(f"✅ 配置文件中已包含加载命令，无需重复添加")
            return True
        
        # 检查是否包含其他版本的加载命令
        if SCRIPT_NAME in existing_content:
            print(f"⚠️  配置文件中已包含 {SCRIPT_NAME} 的其他加载方式")
            print(f"   建议手动检查配置文件: {profile_path}")
            return True
        
        # 添加加载命令到配置文件
        with open(profile_path, 'a', encoding='utf-8') as f:
            # 如果文件不为空且最后一行不是空行，先添加换行
            if existing_content and not existing_content.endswith('\n'):
                f.write('\n')
            
            f.write('\n# PowerShell 智能提示符自动加载\n')
            f.write(f'{load_command}\n')
        
        print(f"✅ 已成功添加加载命令到配置文件")
        print(f"   加载命令: {load_command}")
        return True
        
    except Exception as e:
        print(f"❌ 更新配置文件失败: {e}")
        print(f"   请手动将以下命令添加到PowerShell配置文件中:")
        print(f"   {load_command}")
        return False

def create_profile_setup():
    """创建PowerShell配置文件设置说明"""
    profile_setup = f"""# PowerShell 配置文件设置说明
# 
# 安装脚本已自动将以下加载命令添加到PowerShell配置文件中：
# . "{TARGET_DIR}\\{SCRIPT_NAME}"
#
# 配置文件位置: {PROFILE_PATH}
#
# 如果需要手动配置，请执行以下步骤：
# 1. 打开PowerShell（以管理员身份运行）
# 2. 执行以下命令编辑配置文件：
#    notepad $PROFILE
# 3. 在配置文件中添加上述加载命令
# 4. 保存文件并重启PowerShell
#
# 使用说明：
# - 重启PowerShell后，新的提示符将自动生效
# - 使用 'mp help' 查看所有可用命令
# - 使用 'mp t ls' 查看所有主题
# - 使用 'mp t +' 循环切换主题"""
    
    setup_file = Path(TARGET_DIR) / "安装说明.txt"
    try:
        with open(setup_file, 'w', encoding='utf-8') as f:
            f.write(profile_setup)
        print(f"📝 已创建安装说明文件: {setup_file}")
        return True
    except Exception as e:
        print(f"⚠️  创建说明文件失败: {e}")
        return False

def show_next_steps():
    """显示后续步骤"""
    print()
    print("🎉 安装完成!")
    print()
    print("📋 后续步骤:")
    print("1. 重启PowerShell，新的智能提示符将自动生效！")
    print()
    print("💡 使用提示:")
    print("   - 使用 'mp help' 查看所有可用命令")
    print("   - 使用 'mp t ls' 查看所有主题")
    print("   - 使用 'mp t +' 循环切换主题")
    print("   - 使用 'mp t Dark' 切换到深色主题")
    print("   - 使用 'mp bg' 切换背景色开关")
    print()
    print("📁 文件位置:")
    print(f"   脚本文件: {TARGET_DIR}\\{SCRIPT_NAME}")
    print(f"   配置文件: {PROFILE_PATH}")
    print(f"   说明文件: {Path(TARGET_DIR) / '安装说明.txt'}")
    print()
    print("🔧 如果提示符没有生效，请检查PowerShell执行策略：")
    print("   Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser")

def main():
    """主函数"""
    print_banner()
    
    # 检查源文件
    if not check_source_file():
        sys.exit(1)
    
    # 创建目标目录
    if not create_target_directory():
        sys.exit(1)
    
    # 复制脚本文件
    if not copy_script():
        sys.exit(1)
    
    # 更新PowerShell配置文件
    update_powershell_profile()
    
    # 创建安装说明
    create_profile_setup()
    
    # 显示后续步骤
    show_next_steps()
    
    print("=" * 60)
    print("✅ 安装脚本执行完成!")
    print("=" * 60)

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n\n❌ 用户中断安装")
        sys.exit(1)
    except Exception as e:
        print(f"\n\n❌ 安装过程中发生未预期的错误: {e}")
        sys.exit(1)